package com.example;

/**
 * 创建线程的两种方式：
 *         1,创建Thread的子类，重写run方法
 *         2,给Thread类传入Runnable接口
 * 两种方式的区别：
 * 第二种方式可以实现数据共享，而且更倾向于面向对象的编程思想。一般都是采用第二种方式。
 * new Thread().start();
 * 调用了start方法后，就会运行Thread类的run方法,如下
 * public void run(){
 *     if(target!=null){
 *        targe.run();
 *     }
 * }
 * 如果target为空，就什么也不做
 *
 *
 *
 * new Thread(
 *         new Runnable(){
 *              public void run() { //1
 *               } 
 *        }
 *   ){
 *        public void run() { //2
 *        } 
 * }.start();
 *
 * 执行的是2run方法
 * 执行的步骤：
 * 先运行子类的run方法，如果子类没有重写run方法，就去运行父类的run方法，上述代码中子类重写了run方法，所以就不会运行Runnable中的run方法。
 *
 */
public class TraditionalThread {
    public static void main(String[] args) {
        //1,创建Thread的子类，重写run方法
        Thread thread = new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < 30; i++) {
                    System.out.println("1: " + Thread.currentThread().getName());
                    System.out.println("2: " + this.getName());
                }
            }
        };
        thread.start();
        //2,给Thread类传入Runnable接口
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 30; i++) {
                System.out.println("1: " + Thread.currentThread().getName());
                //这里this代表Runnable匿名对象，是线程的宿主，不代表线程了
                //System.out.println("2: " + this.getName());

            }
        });
        thread1.start();

        new Thread(){
            public void run() {
                for (int i = 0; i < 30; i++) {
                    System.out.println("thread: " + Thread.currentThread().getName());
                }
            }
        }.start();

        //先找当前对象自己的run()方法执行，如果没找到再去找父类(Runnable)的run()方法
        new Thread(
                new Runnable() {
                    @Override
                    //不会执行，因为是父类的run方法被覆盖了
                    public void run() {
                        for (int i = 0; i < 30; i++) {
                            System.out.println("thread1: " + Thread.currentThread().getName());
                        }
                    }
                }
        ){
            public void run() {
                for (int i = 0; i < 30; i++) {
                    System.out.println("thread2: " + Thread.currentThread().getName());
                }
            }
        }.start();
    }
}
